import Joi from 'joi';

interface TestCase {
  input: string;
  expectedOutput: string;
  description?: string;
}

interface EvaluateRequest {
  language: string;
  code: string;
  testCases: TestCase[];
}

// 支持的语言列表
const supportedLanguages = [
  'javascript',
  'typescript',
  'python',
  'go',
  'rust',
  'java',
  'cpp',
  'ruby',
  'php'
];

// 测试用例验证模式
const testCaseSchema = Joi.object({
  input: Joi.string()
    .required()
    .messages({
      'any.required': '测试用例缺少输入参数'
    }),

  expectedOutput: Joi.string()
    .required()
    .messages({
      'any.required': '测试用例缺少预期输出'
    }),

  description: Joi.string()
    .optional()
});

// 评测请求验证模式
const evaluateRequestSchema = Joi.object({
  language: Joi.string()
    .valid(...supportedLanguages)
    .required()
    .messages({
      'any.required': '缺少语言参数',
      'any.only': '不支持的语言，目前支持：' + supportedLanguages.join(', ')
    }),

  code: Joi.string()
    .required()
    .min(1)
    .max(32768) // 限制代码长度为32KB
    .messages({
      'any.required': '缺少代码内容',
      'string.min': '代码不能为空',
      'string.max': '代码长度超过限制'
    }),

  testCases: Joi.array()
    .items(testCaseSchema)
    .min(1)
    .max(20) // 限制最多20个测试用例
    .required()
    .messages({
      'any.required': '缺少测试用例',
      'array.min': '至少需要1个测试用例',
      'array.max': '测试用例数量不能超过20个'
    })
});

/**
 * 验证代码评测请求
 * @param data 请求数据
 * @returns 验证结果
 */
export function validateEvaluateRequest(data: any) {
  return evaluateRequestSchema.validate(data, { abortEarly: false });
} 